<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>1144. 递减元素使数组呈锯齿状</title>
  </head>
  <body>
    <script>
      //     给你一个整数数组 nums，每次 操作 会从中选择一个元素并 将该元素的值减少 1。

      // 如果符合下列情况之一，则数组 A 就是 锯齿数组：

      // 每个偶数索引对应的元素都大于相邻的元素，即 A[0] > A[1] < A[2] > A[3] < A[4] > ...
      // 或者，每个奇数索引对应的元素都大于相邻的元素，即 A[0] < A[1] > A[2] < A[3] > A[4] < ...
      // 返回将数组 nums 转换为锯齿数组所需的最小操作次数。

      //

      // 示例 1：

      // 输入：nums = [1,2,3]
      // 输出：2
      // 解释：我们可以把 2 递减到 0，或把 3 递减到 1。
      // 示例 2：

      // 输入：nums = [9,6,1,6,2]
      // 输出：4
      //

      // 提示：

      // 1 <= nums.length <= 1000
      // 1 <= nums[i] <= 1000

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/decrease-elements-to-make-array-zigzag
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

      /**
       * @param {number[]} nums
       * @return {number}
       */
      var movesToMakeZigzag = function (nums) {
        //创建两个值用于存放偶数情况和奇数情况所需的操作数。
        let even = 0,
          odd = 0
        for (let i = 0; i < nums.length; i++) {
          //当遍历到i时，求出i的左右两个位置的最小值。
          //注意当i位数组开头或末尾，i-1或者i+1是不存在的。
          //根据题意nums[i]的最大值为1000，所以当不存在时，我们返回1001即可
          let a = Math.min(nums[i - 1] || 1001, nums[i + 1] || 1001) - 1
          //当i%2==0即为偶数位,我们将计算的结果累加到even上，否则累加到odd上
          if (a < nums[i]) i % 2 == 0 ? (even += nums[i] - a) : (odd += nums[i] - a)
        }
        return Math.min(even, odd)
      }
    </script>
  </body>
</html>
